<?php
/**
 * Created by JetBrains PhpStorm.
 * User: Андрей
 * Date: 11.05.12
 * Time: 17:14
 * To change this template use File | Settings | File Templates.
 */

    /*
     * Главный контроллер приложения
     * точка входа
     * (Singleton)
     */

    class FrontController extends ControllerAbstract
    {
        private static $_frontController; // экземпляр класса

        private function __construct()
        {
            $this->setView(new View());

            // special chars
            foreach($_POST as $key => $val)
            {
                $_POST[$key] = htmlspecialchars($val, ENT_QUOTES);
            }

        }

        /*
         * Singleton
         */
        public static function instance()
        {
            if ( self::$_frontController == null)
           {
               self::$_frontController = new self();
           }

           return self::$_frontController;
        }

        /*
         * Запуск контроллера
         */
        
        public function run()
        {
            // получить данные
            $route = new Router();
            $this->_args = $route->getRoute();

            // Если путь плохой пришел
            if (null == $this->_args )
            {
                $this->_view->setRenderTemplate('404.phtml');
                $this->_view->render();
                return ;
            }

            // создать контроллер
            $controller = false;

            $controller = ControllerFabric::getController($this->_args['controller'],
                                                         $this->_view,
                                                         $this->_args['args']);


           
            
            // вызывать действие
            // если действия нету
            if ($this->_args['action'] == null)
            {
                // проверить существование метода
                // index
                if ( !is_callable(array($controller,'index')) )
                {
                    $this->_view->setRenderTemplate('404.phtml');

                } else{
                    call_user_func(array($controller, 'index'), $this->_args['args']);
                }
                
            } else{
                // попытка вызывать метод
                if ( !is_callable(array($controller,$this->_args['action'])) )
                {
                    $this->_view->setRenderTemplate('404.phtml');
                } else{
                    
                    call_user_func(array($controller, $this->_args['action']), $this->_args['args']);
                }
            }
            
            $this->_view->render();
        }
    }
